// 作用：
// 1.设置前置守卫 控制页面访问权限
// 2.加载进度条
// 3.修改网页标题

import getPageTitle from '@/utils/get-page-title'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import router, { asyncRouter, constantRoutes } from './router'
import store from './store'
import { Message } from 'element-ui'

NProgress.configure({ showSpinner: false })
// 定义白名单
const whiteList = ['/login']
router.beforeEach(async(to, from, next) => {
  // 开始进度条
  NProgress.start()
  document.title = getPageTitle(to.meta.title)
  // 开启导航守卫 控制页面访问权限
  const token = store.getters.token
  // 判断有无token 如有token 且去的是登录页面 就重定向回首页页面
  if (token) {
    to.path === '/login' ? next('/') : next()
    // （拓展：在导航守卫也可以发请求 实现了切换页面管理员头像名字也能显示 在Navbar也是可以实现）
    if (!store.getters.name) {
      await store.dispatch('user/getUserInfoAction')
      // 获取用户能看见页面的权限
      const menus = store.state.user.userInfo.roles.menus
      // 筛选出用户能看见页面的权限相比较
      const permRoutes = asyncRouter.filter((item) => {
        return menus.includes(item.name)
      })
      // 通过store。commit提交触发mutation保存数据
      store.commit('user/saveRoutes', [...constantRoutes, ...permRoutes])
      // 把用户能看见的页面加入进去（404页面一定要放在最后一个）
      router.addRoutes([...permRoutes, { path: '*', redirect: '/404', hidden: true }])
    }
    // 结束进度条
    NProgress.done()
    return
  }
  // 判断有无token 如没有token 且去白名单 就next放行
  if (whiteList.includes(to.path)) {
    next()
    return
  }
  // token过期 提示用户并重定向登录页面
  Message.info('请先登录哟')
  next('/login')
})
// 后置守卫
router.afterEach(() => {
  // 结束进度条
  NProgress.done()
})
